<?php


namespace app\common\controller;


use app\api\model\SysOperLog;
use think\Db;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\DbException;

class OperationLog
{
    /**
     * 操作类型
     * @var int[]
     */
    protected static $oper_type = [
        'O' => 0,
        'C' => 1,
        'D' => 2,
        'U' => 3,
        'R' => 4
    ];

    /**
     * 操作成功日志
     * @param $param 请求参数
     * @param $options 自定义参数
     * @param string $oper_type 操作类型
     * @param $json_result 返回参数
     * @throws DataNotFoundException
     * @throws ModelNotFoundException
     * @throws DbException
     */
    public static function OperSuccess($param, $options, $oper_type = 'O', $json_result)
    {
        // 通过token查询用户名
        if (empty($options['token'])) {
            $findOperNameRes = '';
        } else {
            $findOperNameRes = Db::name('admin')
                ->where('token', '=', $options['token'])
                ->field('username')
                ->find();
        }
        // 模块标题
        $sysOperInfo['title'] = $options['title'];
        // 业务类型
        $sysOperInfo['type'] = self::$oper_type[$oper_type];
        // 方法名称
        $sysOperInfo['method'] = $options['method'];
        // 请求方式
        $sysOperInfo['request_method'] = $options['request_method'];
        // 操作人员
        $sysOperInfo['oper_name'] = empty($findOperNameRes) ? '公共人员' : $findOperNameRes['username'];
        // 请求URL
        $sysOperInfo['open_url'] = $options['open_url'];
        // 主机地址
        $sysOperInfo['oper_ip'] = $options['oper_ip'];
        // 操作地点
        $sysOperInfo['oper_location'] = Util::get_location_by_ip($options['oper_ip']);
        // 请求参数
        $sysOperInfo['oper_param'] = json_encode($param);
        // 返回参数
        $sysOperInfo['json_result'] = json_encode($json_result);
        // 操作状态
        $sysOperInfo['status'] = 0;
        // 错误消息
        $sysOperInfo['error_msg'] = '';
        // 操作时间
        $sysOperInfo['oper_time'] = time();
        $sysOperLog = new SysOperLog();
        $sysOperLog->save($sysOperInfo);
    }

    /**
     * 操作失败日志
     * @param $param 请求参数
     * @param $options 自定义参数
     * @param string $oper_type 操作类型
     * @param $json_result 返回参数
     * @param $error_msg 错误消息
     * @throws DataNotFoundException
     * @throws ModelNotFoundException
     * @throws DbException
     */
    public static function OperError($param, $options, $oper_type = 'O', $json_result, $error_msg = '')
    {
        // 通过token查询用户名
        if (empty($options['token'])) {
            $findOperNameRes = '';
        } else {
            $findOperNameRes = Db::name('admin')
                ->where('token', '=', $options['token'])
                ->field('username')
                ->find();
        }
        // 模块标题
        $sysOperInfo['title'] = $options['title'];
        // 业务类型
        $sysOperInfo['type'] = self::$oper_type[$oper_type];
        // 方法名称
        $sysOperInfo['method'] = $options['method'];
        // 请求方式
        $sysOperInfo['request_method'] = $options['request_method'];
        // 操作人员
        $sysOperInfo['oper_name'] = empty($findOperNameRes) ? '公共人员' : $findOperNameRes['username'];
        // 请求URL
        $sysOperInfo['open_url'] = $options['open_url'];
        // 主机地址
        $sysOperInfo['oper_ip'] = $options['oper_ip'];
        // 操作地点
        $sysOperInfo['oper_location'] = Util::get_location_by_ip($options['oper_ip']);
        // 请求参数
        $sysOperInfo['oper_param'] = json_encode($param);
        // 返回参数
        $sysOperInfo['json_result'] = json_encode($json_result);
        // 操作状态
        $sysOperInfo['status'] = 1;
        // 错误消息
        $sysOperInfo['error_msg'] = $error_msg;
        // 操作时间
        $sysOperInfo['oper_time'] = time();
        $sysOperLog = new SysOperLog();
        $sysOperLog->save($sysOperInfo);
    }
}